package org.jeecg.weixin.cp.bean.oa;

import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.experimental.Accessors;
import org.jeecg.weixin.common.bean.ToJson;
import org.jeecg.weixin.cp.util.json.WxCpGsonBuilder;

import java.io.Serializable;
import java.util.List;

/**
 * 日程信息bean.
 *
 * @author <a href="https://github.com/binarywang">Binary Wang</a>
 * @date 2020-12-25
 */
@Data
@Accessors(chain = true)
public class WxCpOaSchedule implements Serializable, ToJson {
	private static final long serialVersionUID = -6821274247372646346L;
	/**
	 * 日程id
	 */
	@SerializedName("schedule_id")
	private String scheduleId;
	/**
	 * 日程编号，是一个自增数字
	 */
	@SerializedName("sequence")
	private Integer sequence;
	/**
	 * 组织者。不多于64字节
	 */
	@SerializedName("organizer")
	private String organizer;
	/**
	 * 日程参与者列表。最多支持2000人
	 */
	@SerializedName("attendees")
	private List<Attendee> attendees;
	/**
	 * 日程标题。0 ~ 128 字符。不填会默认显示为“新建事件”
	 */
	@SerializedName("summary")
	private String summary;
	/**
	 * 日程描述。不多于512个字符
	 */
	@SerializedName("description")
	private String description;
	/**
	 * 提醒相关信息
	 */
	@SerializedName("reminders")
	private Reminder reminders;
	/**
	 * 日程地址。 不多于128个字符
	 */
	@SerializedName("location")
	private String location;
	/**
	 * 日程开始时间，Unix时间戳
	 */
	@SerializedName("start_time")
	private Long startTime;
	/**
	 * 日程结束时间，Unix时间戳
	 */
	@SerializedName("end_time")
	private Long endTime;
	/**
	 *
	 */
	@SerializedName("status")
	private Integer status;
	/**
	 * 日程所属日历ID。该日历必须是access_token所对应应用所创建的日历。 注意，这个日历必须是属于组织者(organizer)的日历；
	 * 如果不填，那么插入到组织者的默认日历上。 第三方应用必须指定cal_id 不多于64字节
	 */
	@SerializedName("cal_id")
	private String calId;

	@Override
	public String toJson() {
		return WxCpGsonBuilder.create().toJson(this);
	}

	@Data
	@Accessors(chain = true)
	public static class Attendee implements Serializable {
		private static final long serialVersionUID = 5419000348428480645L;
		/**
		 * 日程参与者ID， 不多于64字节
		 */
		@SerializedName("userid")
		private String userid;
		/**
		 * 日程参与者的接受状态。 0 - 未处理 1 - 待定 2 - 全部接受 3 - 仅接受一次 4 - 拒绝
		 */
		@SerializedName("response_status")
		private Integer responseStatus;
	}

	@Data
	@Accessors(chain = true)
	public static class Reminder implements Serializable {
		private static final long serialVersionUID = 5030527150838243356L;

		/**
		 * 是否需要提醒。0-否；1-是
		 */
		@SerializedName("is_remind")
		private Integer isRemind;
		/**
		 * 是否重复日程。0-否；1-是
		 */
		@SerializedName("is_repeat")
		private Integer isRepeat;
		/**
		 * 日程开始（start_time）前多少秒提醒，当is_remind为1时有效。 例如： 300表示日程开始前5分钟提醒。目前仅支持以下数值： 0 -
		 * 事件开始时 300 - 事件开始前5分钟 900 - 事件开始前15分钟 3600 - 事件开始前1小时 86400 - 事件开始前1天
		 */
		@SerializedName("remind_before_event_secs")
		private Integer remindBeforeEventSecs;
		/**
		 * 重复类型，当is_repeat为1时有效。目前支持如下类型： 0 - 每日 1 - 每周 2 - 每月 5 - 每年 7 - 工作日
		 */
		@SerializedName("repeat_type")
		private Integer repeatType;
		/**
		 * 重复结束时刻，Unix时间戳。不填或填0表示一直重复
		 */
		@SerializedName("repeat_until")
		private Long repeatUntil;
		/**
		 * 是否自定义重复。0-否；1-是
		 */
		@SerializedName("is_custom_repeat")
		private Integer isCustomRepeat;
		/**
		 * 重复间隔 仅当指定为自定义重复时有效 该字段随repeat_type不同而含义不同 例如：
		 * repeat_interval指定为3，repeat_type指定为每周重复，那么每3周重复一次；
		 * repeat_interval指定为3，repeat_type指定为每月重复，那么每3个月重复一次
		 */
		@SerializedName("repeat_interval")
		private Integer repeatInterval;
		/**
		 * 每周周几重复 仅当指定为自定义重复且重复类型为每周时有效 取值范围：1 ~ 7，分别表示周一至周日
		 */
		@SerializedName("repeat_day_of_week")
		private List<Integer> repeatDayOfWeek;
		/**
		 * 每月哪几天重复 仅当指定为自定义重复且重复类型为每月时有效 取值范围：1 ~ 31，分别表示1~31号
		 */
		@SerializedName("repeat_day_of_month")
		private List<Integer> repeatDayOfMonth;
		/**
		 * 时区。UTC偏移量表示(即偏离零时区的小时数)，东区为正数，西区为负数。 例如：+8 表示北京时间东八区 默认为北京时间东八区 取值范围：-12 ~
		 * +12
		 */
		@SerializedName("timezone")
		private Integer timezone;
	}
}
